package pt.rupeal.invoicexpress.charts; import java.util.HashMap; import java.util.List; import java.util.Map; import org.achartengine.chart.XYChart; import org.achartengine.chart.BarChart.Type; import org.achartengine.model.CategorySeries; import org.achartengine.model.XYMultipleSeriesDataset; import org.achartengine.renderer.XYSeriesRenderer; import org.w3c.dom.Document; import org.w3c.dom.Element; import org.w3c.dom.Node; import org.w3c.dom.NodeList; import pt.rupeal.invoicexpress.R; import pt.rupeal.invoicexpress.model.BarChartModel; import pt.rupeal.invoicexpress.server.InvoiceXpress; import pt.rupeal.invoicexpress.server.InvoiceXpressParser; import pt.rupeal.invoicexpress.utils.InvoiceXpressException; import android.app.Activity; import android.content.Context; import android.util.Log; import android.view.View; public class TreasuryChart { private static final String SETTLED_GRAPH_ID = "settled_values"; private static final String ONTIME_GRAPH_ID = "due_values"; private static final String OVERDUE_GRAPH_ID = "overdue_values"; private static final String FORECAST_GRAPH_ID = "forecast_values"; public View getView(Context context, Map<String, BarChartModel> treasuryChartData) { // if there is no data chart then the application has to generate it if(BarChartModel.hasNoChart(treasuryChartData)) { setGeneratedDataTreasuryChart(treasuryChartData); } String[] months = treasuryChartData.get(SETTLED_GRAPH_ID).getMonths(); double[] valuesSettled = treasuryChartData.get(SETTLED_GRAPH_ID).getValues(); CategorySeries seriesSettled = new CategorySeries(context.getResources().getString(R.string.dashboard_legend_settled)); for (int i = 0; i < valuesSettled.length; i++) { seriesSettled.add(valuesSettled[i]); } double[] valuesOnTime = treasuryChartData.get(ONTIME_GRAPH_ID).getValues(); CategorySeries serieOnTime = new CategorySeries(context.getResources().getString(R.string.dashboard_legend_onTime)); for (int i = 0; i < valuesOnTime.length; i++) { serieOnTime.add(valuesOnTime[i]); } double[] valuesOverdue = treasuryChartData.get(OVERDUE_GRAPH_ID).getValues(); CategorySeries seriesOverdue = new CategorySeries(context.getResources().getString(R.string.dashboard_legend_overdue)); for (int i = 0; i < valuesOverdue.length; i++) { seriesOverdue.add(valuesOverdue[i]); } XYMultipleSeriesDataset dataSet = new XYMultipleSeriesDataset(); dataSet.addSeries(0, seriesSettled.toXYSeries()); dataSet.addSeries(1, serieOnTime.toXYSeries()); dataSet.addSeries(2, seriesOverdue.toXYSeries()); XYSeriesRenderer rendererReceived = new XYSeriesRenderer(); rendererReceived.setColor(context.getResources().getColor(R.color.dashboard_green_color)); XYSeriesRenderer rendererWithIn = new XYSeriesRenderer(); rendererWithIn.setColor(context.getResources().getColor(R.color.dashboard_white_color)); XYSeriesRenderer rendererLiquided = new XYSeriesRenderer(); rendererLiquided.setColor(context.getResources().getColor(R.color.dashboard_red_color)); int width = InvoiceXpress.getInstance().getScreenWidth((Activity) context); int height = InvoiceXpress.getInstance().getScreenHeight((Activity) context); BarChartInvoiceXpressRenderer multipleRenderer = new BarChartInvoiceXpressRenderer(context, width, height, valuesSettled, valuesOnTime, valuesOverdue); multipleRenderer.addSeriesRenderer(rendererReceived); multipleRenderer.addSeriesRenderer(rendererWithIn); multipleRenderer.addSeriesRenderer(rendererLiquided); multipleRenderer.setXAxisMax(months.length); for (int i = 0; i < months.length; i++) { multipleRenderer.addXTextLabel(i+1, months[i]); } XYChart chart = new BarChartInvoiceXpress(context, dataSet, multipleRenderer, Type.DEFAULT); return new GraphicalView(context, chart); } public static String buildRequestHttpGet() { StringBuffer request = new StringBuffer(InvoiceXpress.getInstance().getActiveAccount().getUrl()); request.append("/api/charts/treasury.xml"); request.append("?api_key=" + InvoiceXpress.getInstance().getActiveAccount().getApiKey()); if(InvoiceXpress.DEBUG) { Log.d(TreasuryChart.class.getCanonicalName(), request.toString()); } return request.toString(); } public static Map<String, BarChartModel> getChart(Context context, String xml) throws InvoiceXpressException { Map<String, BarChartModel> graphs = new HashMap<String, BarChartModel>(); InvoiceXpressParser parser = new InvoiceXpressParser(context); Document documentDomElement = parser.getDomElement(xml); Node chartNode = documentDomElement.getElementsByTagName("chart").item(0); List<Node> monthsXml = parser.getChildNodes((Element) chartNode, "series", 0); String[] months = new String[monthsXml.size()]; for (int i = 0; i < monthsXml.size(); i++) { Node node = monthsXml.get(i); months[i] = node.getTextContent(); } Node graphshNode = documentDomElement.getElementsByTagName("graphs").item(0); NodeList graphsXmlNodeList = documentDomElement.getElementsByTagName("graph"); for (int i = 0; i < graphsXmlNodeList.getLength(); i++) { String graphId = ((Element) graphsXmlNodeList.item(i)).getAttribute("gid"); if(FORECAST_GRAPH_ID.equals(graphId)) { continue; } List<Node> graphXml = parser.getChildNodes((Element) graphshNode, "graph", i); double[] values = new double[graphXml.size()]; for (int j = 0; j < graphXml.size(); j++) { Node node = graphXml.get(j); values[j] = Double.parseDouble(node.getTextContent()); } BarChartModel graph = new BarChartModel(graphId, months, values); graph.setSample(false); graphs.put(graphId, graph); } return graphs; } private static void setGeneratedDataTreasuryChart(Map<String, BarChartModel> graphs) { // months String[] months = new String[] {"Jan", "Fev", "Mar", "Abr", "Jun", "Jul", "Ago"}; BarChartModel barChart = new BarChartModel(); // set graph id barChart.setGraphId(SETTLED_GRAPH_ID); // set months barChart.setMonths(months); // set values double[] values = new double[] {100, 500, 1100, 400, 2700, 300, 150}; barChart.setValues(values); // set sample barChart.setSample(true); graphs.put(SETTLED_GRAPH_ID, barChart); barChart = new BarChartModel(); // set graph id barChart.setGraphId(ONTIME_GRAPH_ID); // set months barChart.setMonths(months); // set values values = new double[] {0, 0, 0, 300, 0, 0, 750}; barChart.setValues(values); // set sample barChart.setSample(true); graphs.put(ONTIME_GRAPH_ID, barChart); barChart = new BarChartModel(); // set graph id barChart.setGraphId(OVERDUE_GRAPH_ID); // set months barChart.setMonths(months); // set values values = new double[] {400, 0, 0, 450, 0, 0, 100}; barChart.setValues(values); // set sample barChart.setSample(true); graphs.put(OVERDUE_GRAPH_ID, barChart); } }